package org.example.projekt_dobra_gra_sudoku;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;

public class WidokGry extends View {
    private static final String ZNAK = "Sudoku";
	private final Gra gra;
    private float szerokosc_jednego_pola;
    private float wysokosc_wysokosc_jednego_pola;
    private int wybrany_index_X;
    private int wybrany_index_Y;
    private final Rect wybierzProstokat = new Rect();
	
	public WidokGry(Context context) {
		super(context);
		this.gra = (Gra) context;
		setFocusable(true);
		setFocusableInTouchMode(true);
	}
	
	@Override
	protected void onSizeChanged(int szerokosc, int wysokosc, int stara_szerokosc, int stara_wysokosc) {
		szerokosc_jednego_pola = szerokosc / 9f;
		wysokosc_wysokosc_jednego_pola = wysokosc / 9f;
		wezProstokat(wybrany_index_X, wybrany_index_Y, wybierzProstokat);
		Log.d(ZNAK, "onSizeChanged: szerokosc " + szerokosc_jednego_pola + ", wysokosc_wysokosc_jednego_pola" );
		super.onSizeChanged(szerokosc, wysokosc, stara_szerokosc, stara_wysokosc);
	}

	private void wezProstokat(int wybrany_index_X2, int wybrany_index_Y2,
			Rect wybierzProstokat2) {
		wybierzProstokat2.set((int) (wybrany_index_X2 * szerokosc_jednego_pola), (int) (wybrany_index_Y2 * wysokosc_wysokosc_jednego_pola),(int)
				(wybrany_index_X2 * szerokosc_jednego_pola + szerokosc_jednego_pola), (int) (wybrany_index_Y2 * wysokosc_wysokosc_jednego_pola + wysokosc_wysokosc_jednego_pola)); 
		
		
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		Paint tlo = new Paint();
		tlo.setColor(getResources().getColor(R.color.tlo_planszy));
		canvas.drawRect(0, 0, getWidth(), getHeight(), tlo);
		
		Paint ciemny = new Paint();
		ciemny.setColor(getResources().getColor(R.color.ciemna_plansz));
		
		Paint podswietlenie = new Paint();
		podswietlenie.setColor(getResources().getColor(R.color.podswietlenie_planszy));
		
		Paint jasny = new Paint();
		jasny.setColor(getResources().getColor(R.color.jasna_plansza));
		
		for (int i = 0; i < 9; i++) {
			canvas.drawLine(0, i * wysokosc_wysokosc_jednego_pola,getWidth(),
					i * wysokosc_wysokosc_jednego_pola, jasny);
			
			canvas.drawLine(0, i * wysokosc_wysokosc_jednego_pola + 1,
					getWidth(),i * wysokosc_wysokosc_jednego_pola, podswietlenie);
			
			canvas.drawLine( i * szerokosc_jednego_pola,0 , i * szerokosc_jednego_pola,
					getHeight(), jasny);
			
			canvas.drawLine( i * szerokosc_jednego_pola, 0 ,i * szerokosc_jednego_pola + 1,
					getHeight(), podswietlenie);
		}
		
		for(int i = 0; i < 9; i++) {
			if (i%3 != 0)
				continue;
			canvas.drawLine(0, i * wysokosc_wysokosc_jednego_pola, getWidth(),
					i * wysokosc_wysokosc_jednego_pola, ciemny);
			canvas.drawLine(0, i * wysokosc_wysokosc_jednego_pola + 1, getWidth(),
					i * wysokosc_wysokosc_jednego_pola, podswietlenie);
			canvas.drawLine( i * szerokosc_jednego_pola,0, i * szerokosc_jednego_pola,
					getHeight(), ciemny);
			canvas.drawLine(i * szerokosc_jednego_pola + 1, 0, i * szerokosc_jednego_pola + 1,
					getWidth(), podswietlenie);
			
			
		}
		
		Paint pierwszy_plan_planszy = new Paint(Paint.ANTI_ALIAS_FLAG);
		pierwszy_plan_planszy.setColor(getResources().getColor(
				R.color.pierwszy_plan_planszy));
		pierwszy_plan_planszy.setStyle(Style.FILL);
		pierwszy_plan_planszy.setTextSize(wysokosc_wysokosc_jednego_pola * 0.75f);
		pierwszy_plan_planszy.setTextScaleX(szerokosc_jednego_pola / wysokosc_wysokosc_jednego_pola);
		pierwszy_plan_planszy.setTextAlign(Paint.Align.CENTER);
		
		
		FontMetrics fm = pierwszy_plan_planszy.getFontMetrics();
		float x = szerokosc_jednego_pola / 2;
		float y = wysokosc_wysokosc_jednego_pola / 2 - (fm.ascent + fm.descent) / 2;
		for (int i = 0; i < 9; i++){
			for (int j = 0; j < 9; j++) {
				canvas.drawText(this.gra.ZnakPola(i,j), i * szerokosc_jednego_pola + x,
						j * wysokosc_wysokosc_jednego_pola + y, pierwszy_plan_planszy);
			}
		}
		
		Log.d(ZNAK, "wybierzProstokat=" + wybierzProstokat);
		Paint zaznaczona_plansza = new Paint();
		zaznaczona_plansza.setColor(getResources().getColor(R.color.zaznaczona_plansza));
		canvas.drawRect(wybierzProstokat, zaznaczona_plansza);
		
		Paint podpowiedz = new Paint();
		int p[] = { getResources().getColor(R.color.podpowiedz_pierwsza),
					getResources().getColor(R.color.podpowiedz_druga),
					getResources().getColor(R.color.podpowiedz_trzecia), };
		Rect r = new Rect();
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				int pozostaleruchy = 9 - gra.wezUzytePola(i, j).length;
				if (pozostaleruchy < p.length) {
					wezProstokat(i,j,r);
					podpowiedz.setColor(p[pozostaleruchy]);
					canvas.drawRect(r, podpowiedz);
				}
			}
		}
	}
	
	@Override
	public boolean onKeyDown(int kodKlawiatury, KeyEvent zdarzenie) {
		Log.d(ZNAK,"onKeyDown: kod klawisza=" + kodKlawiatury + ", zdarzenie=" + zdarzenie);
		switch (kodKlawiatury) {
		case KeyEvent.KEYCODE_DPAD_UP:
			wybierz(wybrany_index_X, wybrany_index_Y - 1);
			break;
		case KeyEvent.KEYCODE_DPAD_DOWN:
			wybierz(wybrany_index_X, wybrany_index_Y + 1);
			break;
		case KeyEvent.KEYCODE_DPAD_LEFT:
			wybierz(wybrany_index_X - 1, wybrany_index_Y);
			break;
		case KeyEvent.KEYCODE_DPAD_RIGHT:
			wybierz(wybrany_index_X + 1, wybrany_index_Y);
			break;
		case KeyEvent.KEYCODE_0:
		case KeyEvent.KEYCODE_SPACE: ustawWybranePole(0); break;
		case KeyEvent.KEYCODE_1: ustawWybranePole(1); break;
		case KeyEvent.KEYCODE_2: ustawWybranePole(2); break;
		case KeyEvent.KEYCODE_3: ustawWybranePole(3); break;
		case KeyEvent.KEYCODE_4: ustawWybranePole(4); break;
		case KeyEvent.KEYCODE_5: ustawWybranePole(5); break;
		case KeyEvent.KEYCODE_6: ustawWybranePole(6); break;
		case KeyEvent.KEYCODE_7: ustawWybranePole(7); break;
		case KeyEvent.KEYCODE_8: ustawWybranePole(8); break;
		case KeyEvent.KEYCODE_9: ustawWybranePole(9); break;
		case KeyEvent.KEYCODE_ENTER:
		case KeyEvent.KEYCODE_DPAD_CENTER:
			gra.ujawnijKlawiatureLubBlad(wybrany_index_X, wybrany_index_Y);
			break;
		default:
			return super.onKeyDown(kodKlawiatury, zdarzenie);
		}
		return true;
	}
	
	private void wybierz(int x, int y) {
		invalidate(wybierzProstokat);
		wybrany_index_X = Math.min(Math.max(x, 0), 8);
		wybrany_index_Y = Math.min(Math.max(y, 0), 8);
		wezProstokat(wybrany_index_X, wybrany_index_Y, wybierzProstokat);
		invalidate(wybierzProstokat);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent zdarzenie) {
		if (zdarzenie.getAction() != MotionEvent.ACTION_DOWN)
			return super.onTouchEvent(zdarzenie);
		
		wybierz((int) (zdarzenie.getX() / szerokosc_jednego_pola), (int) (zdarzenie.getY() / wysokosc_wysokosc_jednego_pola));
		gra.ujawnijKlawiatureLubBlad(wybrany_index_X, wybrany_index_Y);
		Log.d(ZNAK, "onTouchEvent: x" + wybrany_index_X + ", y" + wybrany_index_Y);
		return true;
	}
	
	public void ustawWybranePole(int pole) {
		if (gra.ustawPoleJesliPoprawne(wybrany_index_X, wybrany_index_Y, pole)) {
			invalidate();
		} else {
			Log.d(ZNAK, "ustawWybranePole: nieprawidlowe: " + pole);
		}
	}
	
	
	
	}


